完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-18
在過去 17 天裡,我們的專案功能逐步增加:從最初的訓練流程,到 API 服務、推論部署、JWT + RBAC、Audit Log。隨著功能愈來愈多,維護成本 和 測試難度 也開始浮現。
今天,我們聚焦在 模組化設計:把核心元件拆分成 train/
、data/
、monitor/
等模組,讓專案結構更清晰、更容易測試與擴展。
main.py
或單一檔案裡,導致修改一處牽一髮動全身。data/validation.py
或 tools/checkpoint_manager.py
單獨測試,不必每次都跑整個系統。換句話說,模組化是平台邁向「規模化」的必經之路。
目前我們已經有一些初步模組化(像 auth/jwt_utils.py
、data_management/*
、monitoring/performance.py
),但還能更進一步。
我將結構調整為以下形式:
app/
├── api/ # API 路由
│ └── routes/
├── auth/ # 認證與授權
├── core/ # 系統核心 (config, logger, settings)
├── data/ # 資料相關 (data_management 改名為 data)
│ ├── validation.py
│ ├── analysis.py
│ └── versioning.py
├── monitor/ # 監控 (monitoring 改名為 monitor)
│ ├── performance.py
│ └── audit.py
├── tasks/ # 任務 (訓練 & 推論)
│ ├── training.py
│ └── inference.py
├── tools/ # 輔助工具
└── main.py
主要改進:
這樣一來,結構不僅更清楚,也能對應到開發與測試的邏輯單元。
Config 與 Settings 拆分
settings/
:系統級設定(dotenv、環境變數)config/
:實驗級設定(模型、超參數,來自 yaml)監控模組強化
測試對應模組化
tests/
├── test_auth.py
├── test_data.py
├── test_monitor.py
├── test_tasks.py
└── test_api.py
模組化後,測試也能清楚對應,符合 TDD 的精神。
Day 18 的關鍵在於,平台不只是功能增加,而是開始注重結構設計。
模組化讓專案更易於維護、測試與協作,也讓我們能更安心地持續擴展 —— 不論是加入新的監控、支援更多推論框架,甚至要上 K8s,都能在既有架構下平滑發展。
這是從「能跑」到「能維護」的重要轉折。
📎 AI 協作記錄:今日開發指令
請幫我重構專案目錄,達成更清晰的模組化設計。具體需求如下:
### 1. 資料管理模組
- 將 `app/data_management/` 改名為 `app/data/`
- 檔案重新命名:
- `data_validator.py` → `validation.py`
- `dataset_analyzer.py` → `analysis.py`
- `version_manager.py` → `versioning.py`
- 更新所有 import,確保使用新路徑:
- `from app.data_management.data_validator import ...` → `from app.data.validation import ...`
- 其他相同規則依此更新。
### 2. 監控模組
- 將 `app/monitoring/` 改名為 `app/monitor/`
- 保留 `performance.py`
- 新增 `audit.py`,並將 `auth/audit_log.py` 的程式碼移動進來
- 確保 import 更新:
- `from app.auth.audit_log import ...` → `from app.monitor.audit import ...`
### 3. 認證模組
- `auth/jwt_utils.py` 保留在原位置
- 只刪除 `auth/audit_log.py`(已移動到 `monitor/audit.py`)
### 4. 核心模組
- 新增 `app/core/` 目錄
- 移動以下檔案:
- `config.py` → `core/config.py`
- `logger_config.py` → `core/logger.py`(重新命名為更簡潔)
- `settings.py` → `core/settings.py`
- 更新 import,例如:
- `from app.config import ...` → `from app.core.config import ...`
- `from app.logger_config import ...` → `from app.core.logger import ...`
### 5. 任務模組
- `app/tasks/` 保留
- `training.py` 留在原處
- 新增 `inference.py`,並將 `inference_api.py` 的推論服務邏輯移動進來
- 移除 `app/inference_api.py`
- 更新 import:
- 原本 `from app.inference_api import ...` → `from app.tasks.inference import ...`
### 6. 測試目錄調整
- 建立 `tests/` 目錄(如果尚未存在)
- 拆分測試檔案,依模組對應:
- `tests/test_auth.py` → 測試 JWT
- `tests/test_data.py` → 測試資料管理模組
- `tests/test_monitor.py` → 測試 performance & audit
- `tests/test_tasks.py` → 測試 Celery 任務與訓練邏輯
- `tests/test_api.py` → 測試 FastAPI 路由
- 調整 pytest 的 import,確保能找到正確模組。
### 7. README 與 Makefile 更新
- README 中的路徑範例更新,例如:
- `app/data_management/data_validator.py` → `app/data/validation.py`
- Makefile 中涉及 `inference_api.py` 的命令改成對應 `tasks/inference.py`
---
請在完成後:
1. 確保所有 import 已正確修改。
2. 確保 `pytest` 可以通過(至少能成功載入模組)。
3. 更新 `.gitignore`,避免 `__pycache__/` 舊目錄造成混亂。